<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>155变量和函数提升</title>
</head>

<body>
  <h1>155变量和函数提升</h1>
  <script>
    /*
      一、变量提升
        1 var关键字
          以前使用var声明变量，它允许程序员先使用变量，后声明。这就是因为变量提升导致的。
          如今var基本已经弃用，主流的let和const声明的变量不会再进行变量提升。也就意味着变量必须先声明后使用。
    */
    console.log(a) // undefined
    var a = 1

    function fn() {
      console.log(b) // undefined
      var b = 2
    }
    fn()

    foo() // 2 因为函数提升，因此可以先调用后声明
    function foo() {
      console.log('函数提升：函数声明定义的函数才会提升')
    }

    f() // f是通过函数表达式定义的函数，无法进行函数提升。只会将变量f提升，因此f此时是undefined，不是函数，会报错。
    var f = function () {
      console.log('函数表达式无法提升')
    }
  </script>
</body>

</html>